#include <iostream>
#include <string>
#include <fstream>

//#include "bundle.h" //前提: 当前路径下存在bundle.h文件
//g++ bundleDecompress.cc bundle.cpp -o bundleDecom -lpthread -std=c++11 

#include "../server/mylib/include/bundle.h"//使用自己包装的库
//g++ bundleDecompress.cc -I ../mylib/include/ -L ../mylib/lib/ -l bundle -o bundleDecom -lpthread -std=c++11 

//./bundleDecom bundle.cpp.lz  bundle_mydecom.cpp

void usage()
{
    std::cout << "./file.exe 压缩包A 解压后的文件B == want A to B" << std::endl;
}
int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        usage();
        return -1;
    }
    std::string zipFile = argv[1];
    std::string unzippedFile = argv[2];

    // 1.获取压缩包大小
    std::ifstream ifs;
    ifs.open(zipFile, std::ios::binary); // 二进制形式打开压缩包
    ifs.seekg(0, std::ios::end);         // 文件指针从文件首移动到文件尾
    // std::streampos std::istream::tellg()
    size_t fsize = ifs.tellg();  // 获取当前指针距文件首的偏移量
    ifs.seekg(0, std::ios::beg); // 恢复文件指针到文件首

    // 2.将压缩包文件内容存入body 二进制.zip ==> string.zip
    std::string body;
    body.resize(fsize);
    // 从输入流 ifs 中读取 fsize 字节的数据到字符数组 body
    ifs.read(&body[0], fsize);
    ifs.close();

    // 3.解压缩文件 解压缩后的数据存入unpacked; 
    // string.zip ==> string
    std::string unpacked = bundle::unpack(body);

    // 4. 打开用户指定的解压后的文件名 将上述解压缩后的数据存入该文件
    //  string ==> 二进制-File
    std::ofstream ofs;
    ofs.open(unzippedFile, std::ios::binary);
    ofs.write(&unpacked[0], unpacked.size());
    ofs.close();
    
    return 0;
}
